package com.ceair.provider;

import com.ceair.store.MongoChatMemoryStore;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author wangbaohai
 * @ClassName MyChatAssistantProvider
 * @description: 智能体配置
 * @date 2025年05月16日
 * @version: 1.0.0
 */
@Configuration
@RequiredArgsConstructor
public class MyChatAssistantProvider {

    private final MongoChatMemoryStore mongoChatMemoryStore;
    private final EmbeddingModel embeddingModel;
    private final EmbeddingStore<TextSegment> embeddingStore;

    /**
     * 配置并创建一个ChatMemoryProvider bean
     * ChatMemoryProvider是一个提供聊天记忆功能的服务，用于在聊天窗口中保留一定数量的消息
     *
     * @return ChatMemoryProvider接口的实现，用于生成和管理聊天记忆
     */
    @Bean
    public ChatMemoryProvider chatMemoryProvider() {
        return memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId) // 设置聊天记忆的ID
                .maxMessages(10) // 设置聊天窗口中最大消息数量为10条
                .chatMemoryStore(mongoChatMemoryStore) // 设置聊天记忆存储器为MongoChatMemoryStore实例
                .build(); // 构建并返回配置好的MessageWindowChatMemory实例
    }

    /**
     * 配置并创建一个EmbeddingStoreContentRetriever实例，用于从PineconeEmbeddingStore中检索内容
     * 此方法通过注解@Bean标记，表明该方法会返回一个Spring框架管理的Bean实例
     *
     * @return EmbeddingStoreContentRetriever实例，配置了特定的嵌入模型和嵌入存储，
     * 以及检索时的最大结果数量和最小分数阈值
     */
    @Bean
    public EmbeddingStoreContentRetriever pinconeContentRetriever() {
        // 创建并返回一个EmbeddingStoreContentRetriever实例，用于从PineconeEmbeddingStore中检索内容
        return EmbeddingStoreContentRetriever.builder()
                .embeddingModel(embeddingModel) // 设置嵌入模型为embeddingModel实例
                .embeddingStore(embeddingStore) // 设置嵌入存储为pineconeEmbeddingStore实例
                .maxResults(1) // 设置最大结果数量为1
                .minScore(0.8) // 设置最小分数为0.8
                .build();
    }


}
